package com.sky.service.impl;

import com.sky.constant.MessageConstant;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.service.SetmealService;
import com.sky.service.ShoppingCartService;
import com.sky.utils.ThreadLocalUtil;
import com.sky.vo.DishVO;
import com.sky.vo.SetmealVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * C端购物车业务层接口实现类
 *
 * @Author Vsunks.v
 * @Date 2023/5/7 15:05
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description:
 */
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    ShoppingCartMapper shoppingCartMapper;

    @Autowired
    DishService dishService;

    @Autowired
    SetmealService setmealService;

    /**
     * 查询当前登录用户的购物车，有隐含条件：当前登录用户的id
     *
     * @return
     */
    @Override
    public Result<List<ShoppingCart>> list() {
        // 获取当前登录用户的id
        // 调用mapper查询
        List<ShoppingCart> shoppingCarts =
                shoppingCartMapper.list(ShoppingCart.builder().userId(ThreadLocalUtil.getCurrentId()).build());

        // 组织数据并返回
        // if (shoppingCarts != null && shoppingCarts.size() > 0) {
        return Result.success(shoppingCarts);
        // }
        // return Result.error(MessageConstant.SHOPPING_CART_EMPTY);
    }

    /**
     * 加入购物车（隐含条件：当前登录用户的id）
     *
     * @param shoppingCartDTO 加入购物车商品的id（口味）
     * @return
     */
    @Override
    public Result add(ShoppingCartDTO shoppingCartDTO) {
        // 1. 准备相关条件
        // 1.1 组织隐含条件
        Long userId = ThreadLocalUtil.getCurrentId();

        // 1.2 复制主要条件
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        shoppingCart.setUserId(userId);

        // 2. 查询购物车表，判断是否该菜品已经在购物车
        // 查询条件：根据菜品id、套餐id、口味查询
        List<ShoppingCart> shoppingCarts = shoppingCartMapper.list(shoppingCart);

        // 2.1 是，数量+1，并更新到数据库
        if (shoppingCarts != null && shoppingCarts.size() > 0) {
            ShoppingCart scIdb = shoppingCarts.get(0);
            scIdb.setNumber(scIdb.getNumber() + 1);
            // 更新到数据库
            shoppingCartMapper.updateNumberById(scIdb);
        } else {
            // 2.2 否，新增当前购物车项到购物车表

            // 2.2.1 完善购物车项的信息：基本信息
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());

            // 2.2.2 完善购物车项的信息（判断是套餐还是菜品，分别处理）
            Long dishId = shoppingCart.getDishId();
            if (dishId != null) {
                // a. 菜品，查询菜品信息，封装到购物车项
                Result<DishVO> dishResult = dishService.findByIdWithFlavors(dishId);
                DishVO dishVO = dishResult.getData();

                shoppingCart.setAmount(dishVO.getPrice());
                shoppingCart.setImage(dishVO.getImage());
                shoppingCart.setName(dishVO.getName());
            } else {
                // b. 套餐，查询套餐信息，封装到购物车项
                Result<SetmealVO> setmealResult = setmealService.findByIdWithDishes(shoppingCart.getSetmealId());
                SetmealVO setmealVO = setmealResult.getData();

                shoppingCart.setAmount(setmealVO.getPrice());
                shoppingCart.setImage(setmealVO.getImage());
                shoppingCart.setName(setmealVO.getName());
            }

            // 2.2.3 新增到数据库
            shoppingCartMapper.insert(shoppingCart);

        }
        // 3. 组织数据并响应数据
        return Result.success();
    }


    /**
     * 删减购物车（隐含条件：当前登录用户的id）
     *
     * @param shoppingCartDTO 删减购物车商品的id（口味）
     * @return
     */
    @Override
    public Result sub(ShoppingCartDTO shoppingCartDTO) {
        // 1. 准备相关条件
        // 1.1 组织隐含条件
        Long userId = ThreadLocalUtil.getCurrentId();

        // 1.2 复制主要条件
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        shoppingCart.setUserId(userId);

        // 2. 查询购物车表，判断是否该菜品数量是否>1
        // 查询条件：根据菜品id、套餐id、口味查询
        List<ShoppingCart> shoppingCarts = shoppingCartMapper.list(shoppingCart);

        // 2.1 是，数量-1，并更新到数据库
        if (shoppingCarts != null && shoppingCarts.size() > 0 && shoppingCarts.get(0).getNumber() > 1) {
            ShoppingCart scIdb = shoppingCarts.get(0);
            scIdb.setNumber(scIdb.getNumber() - 1);
            // 更新到数据库
            shoppingCartMapper.updateNumberById(scIdb);
        } else {
            // 2.2 否，删除该购物车项
            shoppingCartMapper.deleteByCondition(shoppingCart);

        }
        // 3. 组织数据并响应数据
        return Result.success();
    }

    /**
     * 清空自己的购物车（隐含条件：当前登录的用户id）
     *
     * @return
     */
    @Override
    public Result clean() {
        // 获取当前路的用户id

        // 根据用户id删除购物项
        // if (shoppingCartMapper.deleteByUserId(ThreadLocalUtil.getCurrentId()) > 0) {
        shoppingCartMapper.deleteByUserId(ThreadLocalUtil.getCurrentId());
        // 组织数据并返回

        return Result.success(MessageConstant.SHOPPING_CLEAN_SUCCESS);
        // }
        // return Result.error(MessageConstant.SHOPPING_CLEAN_FAIL);
    }

    /**
     * 批量添加到购物车
     * @param shoppingCarts
     * @return 是否添加成功
     */
    @Override
    public boolean saveBatch(List<ShoppingCart> shoppingCarts) {
        return shoppingCartMapper.insertBatch(shoppingCarts) >0;
    }
}
